home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / ear / mui23dev.lha / MUI / Developer / Modula / txt / MuiClasses.mod < prev    next >
Text File  |  1994-06-30  |  8KB  |  282 lines

  1. IMPLEMENTATION MODULE MuiClasses;
  2.  
  3. (*************************************************************************
  4. ** Structures and Macros for creating MUI custom classes.
  5. **
  6. ** converted for M2 by Christian 'Kochtopf' Scholz
  7. **
  8. **************************************************************************
  9. **
  10. ** $Id: MuiClasses.mod 1.3 1994/06/30 21:03:01 Kochtopf Exp $
  11. **
  12. **************************************************************************)
  13.  
  14. FROM    SYSTEM      IMPORT CAST, ADR, BYTE, ADDRESS, REG, SETREG;
  15. FROM    MuiMacros   IMPORT APTR;
  16. FROM    IntuitionD  IMPORT ObjectPtr, WindowPtr, ScreenPtr, DrawInfoPtr, IBox,
  17.                            IntuiMessagePtr, IClassPtr, IClass;
  18. FROM    GraphicsD   IMPORT TextFontPtr, RastPortPtr;
  19. FROM    ExecD       IMPORT MinNode;
  20. FROM    UtilityD    IMPORT Hook, HookPtr;
  21. IMPORT R;
  22.  
  23. (*
  24. ** first some general BOOPSI-things, which aren't defined in the normal defs.
  25. *)
  26.  
  27. TYPE    object = RECORD
  28.                     oNode   : MinNode;
  29.                     oClass  : IClassPtr;
  30.                  END;
  31.  
  32. (* get a pointer to our instance data *)
  33.  
  34. PROCEDURE InstData(cl : IClassPtr; obj : ObjectPtr) : ADDRESS;
  35.     BEGIN
  36.         RETURN (CAST(ADDRESS, obj) + ADDRESS(cl^.instOffset));
  37.     END InstData;
  38.  
  39. (* get the size ... *)
  40.  
  41. PROCEDURE InstSize(cl : IClassPtr) : CARDINAL;
  42.     BEGIN
  43.         RETURN cl^.instOffset+cl^.instSize+SIZE(object);
  44.     END InstSize;
  45.  
  46.  
  47. (* 
  48. ** something, which we can cast your object-pointer to
  49. ** (just used iternally)
  50. *)
  51.  
  52. TYPE    dummyXFC = RECORD
  53.                     mnd : mNotifyData;
  54.                     mad : mAreaData;
  55.                    END;
  56.  
  57.         dummyXFCPtr = POINTER TO dummyXFC;
  58.  
  59.  
  60. (*
  61. ** now the functions to get to some types of data of our object.
  62. *)
  63.  
  64.  
  65. PROCEDURE muiNotifyData(obj : APTR) : mNotifyDataPtr;
  66.     BEGIN
  67.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mnd);
  68.     END muiNotifyData;
  69.  
  70. PROCEDURE muiAreaData(obj : APTR) : mAreaDataPtr;
  71.     BEGIN
  72.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mad);
  73.     END muiAreaData;
  74.  
  75. PROCEDURE muiGlobalInfo(obj : APTR) : mGlobalInfoPtr;
  76.     BEGIN
  77.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndGlobalInfo;
  78.     END muiGlobalInfo;
  79.  
  80. PROCEDURE muiRenderInfo(obj : APTR) : mRenderInfoPtr;
  81.     BEGIN
  82.         RETURN CAST(dummyXFCPtr, obj)^.mad.madRenderInfo;
  83.     END muiRenderInfo;
  84.  
  85.  
  86. (*
  87. ** here the macros from mui.h.
  88. ** use them to get e.g. your rastport.
  89. *)
  90.  
  91. PROCEDURE OBJ_app(obj : APTR) : ObjectPtr;
  92.     BEGIN
  93.         RETURN muiGlobalInfo(obj)^.mgiApplicationObject;
  94.     END OBJ_app;
  95.  
  96. PROCEDURE OBJ_win(obj : APTR) : ObjectPtr;
  97.     BEGIN
  98.         RETURN muiRenderInfo(obj)^.mriWindowObject;
  99.     END OBJ_win;
  100.  
  101. PROCEDURE OBJ_dri(obj : APTR) : DrawInfoPtr;
  102.     BEGIN
  103.         RETURN muiRenderInfo(obj)^.mriDrawInfo;
  104.     END OBJ_dri;
  105.  
  106. PROCEDURE OBJ_window(obj : APTR) : WindowPtr;
  107.     BEGIN
  108.         RETURN muiRenderInfo(obj)^.mriWindow;
  109.     END OBJ_window;
  110.  
  111. PROCEDURE OBJ_screen(obj : APTR) : ScreenPtr;
  112.     BEGIN
  113.         RETURN muiRenderInfo(obj)^.mriScreen;
  114.     END OBJ_screen;
  115.  
  116. PROCEDURE OBJ_rp(obj : APTR) : RastPortPtr;
  117.     BEGIN
  118.         RETURN muiRenderInfo(obj)^.mriRastPort;
  119.     END OBJ_rp;
  120.  
  121. PROCEDURE OBJ_left(obj : APTR) : INTEGER;
  122.     BEGIN
  123.         RETURN muiAreaData(obj)^.madBox.left;
  124.     END OBJ_left;
  125.  
  126. PROCEDURE OBJ_top(obj : APTR) : INTEGER;
  127.     BEGIN
  128.         RETURN muiAreaData(obj)^.madBox.top;
  129.     END OBJ_top;
  130.  
  131. PROCEDURE OBJ_width(obj : APTR) : INTEGER;
  132.     BEGIN
  133.         RETURN muiAreaData(obj)^.madBox.width;
  134.     END OBJ_width;
  135.  
  136. PROCEDURE OBJ_height(obj : APTR) : INTEGER;
  137.     BEGIN
  138.         RETURN muiAreaData(obj)^.madBox.height;
  139.     END OBJ_height;
  140.  
  141. PROCEDURE OBJ_right(obj : APTR) : INTEGER;
  142.     BEGIN
  143.         RETURN OBJ_left(obj)+OBJ_width(obj)-1;
  144.     END OBJ_right;
  145.  
  146. PROCEDURE OBJ_bottom(obj : APTR) : INTEGER;
  147.     BEGIN
  148.         RETURN OBJ_top(obj)+OBJ_height(obj)-1;
  149.     END OBJ_bottom;
  150.  
  151. PROCEDURE OBJ_addleft(obj : APTR) : INTEGER;
  152.     BEGIN
  153.         RETURN INTEGER(muiAreaData(obj)^.madAddLeft);
  154.     END OBJ_addleft;
  155.  
  156. PROCEDURE OBJ_addtop(obj : APTR) : INTEGER;
  157.     BEGIN
  158.         RETURN INTEGER(muiAreaData(obj)^.madAddTop);
  159.     END OBJ_addtop;
  160.  
  161. PROCEDURE OBJ_subwidth(obj : APTR) : INTEGER;
  162.     BEGIN
  163.         RETURN INTEGER(muiAreaData(obj)^.madSubWidth);
  164.     END OBJ_subwidth;
  165.  
  166. PROCEDURE OBJ_subheight(obj : APTR) : INTEGER;
  167.     BEGIN
  168.         RETURN INTEGER(muiAreaData(obj)^.madSubHeight);
  169.     END OBJ_subheight;
  170.  
  171. PROCEDURE OBJ_mleft(obj : APTR) : INTEGER;
  172.     BEGIN
  173.         RETURN OBJ_left(obj)+OBJ_addleft(obj);
  174.     END OBJ_mleft;
  175.  
  176. PROCEDURE OBJ_mtop(obj : APTR) : INTEGER;
  177.     BEGIN
  178.         RETURN OBJ_top(obj)+OBJ_addtop(obj);
  179.     END OBJ_mtop;
  180.  
  181. PROCEDURE OBJ_mwidth(obj : APTR) : INTEGER;
  182.     BEGIN
  183.         RETURN OBJ_width(obj)-OBJ_subwidth(obj);
  184.     END OBJ_mwidth;
  185.  
  186. PROCEDURE OBJ_mheight(obj : APTR) : INTEGER;
  187.     BEGIN
  188.         RETURN OBJ_height(obj)-OBJ_subheight(obj);
  189.     END OBJ_mheight;
  190.  
  191. PROCEDURE OBJ_mright(obj : APTR) : INTEGER;
  192.     BEGIN
  193.         RETURN OBJ_mleft(obj)+OBJ_mwidth(obj)-1;
  194.     END OBJ_mright;
  195.  
  196. PROCEDURE OBJ_mbottom(obj : APTR) : INTEGER;
  197.     BEGIN
  198.         RETURN OBJ_mtop(obj)+OBJ_mheight(obj)-1;
  199.     END OBJ_mbottom;
  200.  
  201. PROCEDURE OBJ_font(obj : APTR) : TextFontPtr;
  202.     BEGIN
  203.         RETURN muiAreaData(obj)^.madFont;
  204.     END OBJ_font;
  205.  
  206. PROCEDURE OBJ_flags(obj : APTR) : MADFlagSet;
  207.     BEGIN
  208.         RETURN muiAreaData(obj)^.madFlags;
  209.     END OBJ_flags;
  210.  
  211.  
  212. (*
  213. ** here are some new procedures to generate dispatchers which restore A4
  214. *)
  215.  
  216. (* first the 'real' dispatcher *)
  217.  
  218. PROCEDURE DispatchEntry(class{R.A0} : HookPtr;
  219.                         object{R.A2}: ADDRESS;
  220.                         msg{R.A1}   : ADDRESS)     : ADDRESS;
  221.     (*$SaveA4:=TRUE*)
  222.     BEGIN
  223.         SETREG (R.A4, CAST(IClassPtr,class)^.dispatcher.data);
  224.         RETURN CAST(DispatcherDef,CAST(IClassPtr,class)^.dispatcher.subEntry)(CAST(IClassPtr,class), object, msg);
  225.     END DispatchEntry;
  226.  
  227. (* fill the dispatcher-record inside the class *)
  228.  
  229. PROCEDURE MakeDispatcher(entry:DispatcherDef; VAR myclass : IClassPtr);
  230.  
  231.     BEGIN
  232.             myclass^.dispatcher.node.succ  := NIL;
  233.             myclass^.dispatcher.node.pred  := NIL;
  234.             myclass^.dispatcher.entry      := DispatchEntry;
  235.             myclass^.dispatcher.subEntry   := CAST(ADDRESS,entry);
  236.             myclass^.dispatcher.data       := REG(R.A4);
  237.     END MakeDispatcher;
  238.  
  239.  
  240.  
  241. (* a useful PROCEDURE! *)
  242.  
  243. PROCEDURE FillMinMaxInfo (msg : mpAskMinMaxPtr; MinWidth   : CARDINAL;
  244.                                                 DefWidth   : CARDINAL;
  245.                                                 MaxWidth   : CARDINAL;
  246.                                                 MinHeight  : CARDINAL;
  247.                                                 DefHeight  : CARDINAL;
  248.                                                 MaxHeight  : CARDINAL);
  249.     BEGIN                                               
  250.  
  251.         msg^.MinMaxInfo^.MinWidth  := msg^.MinMaxInfo^.MinWidth +MinWidth;
  252.         msg^.MinMaxInfo^.DefWidth  := msg^.MinMaxInfo^.DefWidth +DefWidth;
  253.         msg^.MinMaxInfo^.MaxWidth  := msg^.MinMaxInfo^.MaxWidth +MaxWidth;
  254.  
  255.         msg^.MinMaxInfo^.MinHeight := msg^.MinMaxInfo^.MinHeight +MinHeight;
  256.         msg^.MinMaxInfo^.DefHeight := msg^.MinMaxInfo^.DefHeight +DefHeight;
  257.         msg^.MinMaxInfo^.MaxHeight := msg^.MinMaxInfo^.MaxHeight +MaxHeight;
  258.  
  259.     END FillMinMaxInfo;
  260.  
  261. (*
  262. ** 2 useful procedures for testing if some coordinates are inside your object
  263. ** (converted from the ones in class3.c. So look there how to use... )
  264. *)
  265.  
  266. PROCEDURE OBJ_between(a,x,b : INTEGER) : BOOLEAN;
  267.     BEGIN
  268.         RETURN ((x>=a) AND (x<=b));
  269.     END OBJ_between;
  270.  
  271. PROCEDURE OBJ_isInObject(x, y : INTEGER; obj : ObjectPtr) : BOOLEAN;
  272.     BEGIN
  273.         RETURN (OBJ_between(OBJ_mleft(obj), x, OBJ_mright(obj)) AND
  274.                 OBJ_between(OBJ_mtop(obj), y, OBJ_mbottom(obj)));
  275.     END OBJ_isInObject;
  276.  
  277.  
  278.  
  279.  
  280. END MuiClasses.
  281.  
  282.